/*
	Copyright (c) 2011 Andrey O. Zbitnev (azbitnev@gmail.com)
	Licensed under the MIT License (LICENSE).

	$Id: ys.menu.js 19 2012-04-13 06:57:56Z azbitnev@gmail.com $

	version: 0.12pa
*/

(function ($) {

	// class menu
	$.ys.menu = { 

		create: function (selector, options) {

			var defaults = {
				show: function ($ul) {
					$ul.parents('li:eq(0)').addClass('selected')
					if ($.browser.msie) {
						$ul.css({ display: 'block' })
					} else {
						$ul.css({ opacity: 0, display: 'block' })
					}
					if (!$ul.data('initial-width'))
						$ul.data('initial-width', $ul.width())
					var $root = $ul.parents('.ys-menu')
					if ($ul.offset().left + $ul.outerWidth()  >  $root.offset().left + $root.outerWidth())
						$ul.css('margin-left', '-' + $ul.css('margin-left'))
					if (!$.browser.msie) {
						$ul.css({ width: 0 }).animate({ opacity: 1, width: $ul.data('initial-width') }, 'fast', 'swing', function () {
						})
					}
				},
				hide: function ($ul) {
					$ul.find('li').removeClass('selected')
					$ul.parents('li:eq(0)').removeClass('selected')
					if ($.browser.msie) {
						$ul.css('display', 'none')
					} else {
						$ul.animate({ opacity: 0 }, 'fast', 'swing', function () {
							$ul.css('display', 'none')
						})
					}
				}
			}

			var opts = $.extend(defaults, options);

			function makeMenu($li, level) {

				var $a = $li.children('a:eq(0)')
				var $ul = $li.children('ul:eq(0)')
				var hasSubmenu = ($ul.length ? true : false)

				if (!$ul.hasClass('ys-list'))
					$ul.addClass('ys-list')

				if ($.browser.msie && $.browser.version <= 8 && level > 0) {
					$a.hover(
						function () { $a.addClass('hovered').text($a.text()) },
						function () { $a.removeClass('hovered').text($a.text()) }
					)
				}
				
				if ($li.hasClass('disabled'))
					$a.removeAttr('href').mousedown(function (evt) {
						evt.preventDefault()
						return false
					})

				if (hasSubmenu) {

					function closeSubmenu() {
						if ($ul.css('display') != 'none')
							opts.hide($ul)
					}

					$('body').click(function () {
						closeSubmenu()
					}).keydown(function (evt) {
						if (evt.keyCode == 27)
							closeSubmenu()
					})

					if (level && !$a.hasClass('ys-next'))
						$a.addClass('ys-next')

					$li.bind('click', function (evt) {
						if ($(this).hasClass('disabled'))
							return
						var vis = ($ul.css('display') == 'none' ? true : false)
						$li.parent().children('li').children('ul').each(function () {
							if ($(this).css('display') != 'none')
								opts.hide($(this))
						})
						$ul.find('ul').css('display', 'none')
						if (level && vis) {

							$ul.css({
								'margin-top': '-' + ($li.outerHeight() - parseInt($li.css('padding-top'))) + 'px',
								'margin-left': '' + ($li.outerWidth() - parseInt($li.css('padding-left'))) + 'px'
							})
						}
						if (vis) {
							opts.show($ul)
							evt.preventDefault()
							return false
						} else {
							opts.hide($ul)
						}
					})

					$ul.children('li').each(function () {
						makeMenu($(this), level + 1)
					})

				} else {

					if (!$a.hasClass('final-node'))
						$a.addClass('final-node')
				}
			}

			return $(selector).each(function() {
				var $menu = $(this)
				$menu.removeClass('ys-menu-noscript').addClass('ys-menu').children('li').each(function () {
					makeMenu($(this), 0)
				})
				if (!$menu.hasClass('ys-list'))
					$menu.addClass('ys-list')
				if (!$menu.children('li.clear').length)
					$menu.append('<li class="clear"></li>')
				if ($.browser.msie && $.browser.version <= 8) {
					$menu.addClass('ys-menu-msie')
				} else {
					$menu.removeClass('ys-menu-msie')
				}
			})
		}
	}

})(jQuery);

